package offer.day14;

public class No20isNumeric {
    /*
     * 面试题20：表示数值的字符串
     * 题目：请实现一个函数用来判断字符串是否表示数值（包括整数和小数）
     * 例如：字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值
     * 	但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
     *
     * 思路：数值表示为  A[.B][e|E C]   或        [+|-].[B][e|E C]
     * 	[]此部分可有可无   A整数部分（0-9正负）    B小数部分（0-9）   C指数部分 （0-9正负）
     * 其中0-9的ASCII码是：48，49，50，51，52，53，54，55，56，57
     * 统计 e和E的个数 ，都不能超过1；并且对不同分情况：1、若字符你是E  2、若字符是.  3、若字符是0-9  4、若字符是其他非数值字符且不是E|e
     *
     * */

    public static void main(String[] args) {
        char[] str = {'1','e','1','1'};
        System.out.println(isNumeric(str));
    }

    public static boolean isNumeric(char[] str){
        if(str==null){
             return false;
        }
        int index=0;
        int eCount=0;
        int point=0;
        if(str[0]=='-'|| str[0]=='+'){
            index++;
        }
        for(int i=index;i<str.length;i++){
            if(str[i]=='-' || str[i]=='+'){
                if(str[i-1]!='e' || str[i-1]!='E'){
                    return false;
                }
                continue;
            }
            if(str[i]>47 && str[i]<58){
                continue;
            }
            if(str[i]=='e'||str[i]=='E'){
                eCount++;
                if(eCount>1){
                    return false;
                }
                if(i==0||i==str.length-1||str[i-1]>57||str[i]<48){
                    return false;
                }
                continue;
            }
            if(str[i]=='.'){
                point++;
                if(point>1){
                    return false;
                }
            }
            if((str[i] < 48||str[i] > 57) && (str[i] != 'e' || str[i] != 'E')) {
                return false;
            }
        }
        return true;
    }
}
